﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using CapaDeDatos;
using CapaDeDatos.EF;
using CapaDeDominio;

namespace CapaDePrueba
{
    [TestFixture]
    public class TestClienteDAO
    {
        private IClienteDAO clienteDAO = null; // Clase DAO que se va a probar
        private IMaestraDAO maestraDAO = null; 
        private int codigoGenerado = 0; // Código de Local que se genera en Crear() y se utiliza para el resto de pruebas

        [TestFixtureSetUp]
        public void PrepararPruebas() 
        {
            clienteDAO = new CapaDeDatos.EF.ClienteDAO();
            maestraDAO = new CapaDeDatos.EF.MaestraDAO();
            clienteDAO.Crear(new Cliente()
            { 
                Nombres = "John Eduardo", 
                Apellidos = "Castillo Rivera", 
                Correo="joedca86@gmail.com", 
                Tip_Documento=maestraDAO.Obtener(1), 
                Nro_Documento="43507085", 
                Usuario = (new Usuario(){ User="castilloj", Clave="castilloj"}),
                Estado="1", 
                Fec_Nacimiento= new DateTime(1986,02,28) });
            clienteDAO.Crear(new Cliente()
            {
                Nombres = "Juan Antonio",
                Apellidos = "Perez",
                Correo = "jperez@gmail.com",
                Tip_Documento = maestraDAO.Obtener(1),
                Nro_Documento = "12345678",
                Usuario = (new Usuario() { User = "jperez", Clave = "jperez" }),
                Estado = "1",
                Fec_Nacimiento = new DateTime(1986, 02, 28)
            });
        }
        [Test]
        public void Test1_Crear()
        {
            Assert.IsNotNull(clienteDAO);

            Cliente clienteACrear = new Cliente();
            clienteACrear.Nombres = "Jenny Marilu";
            clienteACrear.Apellidos = "Roman";
            clienteACrear.Correo = "jmarilu@gmail.com";
            clienteACrear.Tip_Documento = maestraDAO.Obtener(1);
            clienteACrear.Nro_Documento = "9876542";
            clienteACrear.Usuario = new Usuario() { User = "jmarilu", Clave = "jmarilu" };
            clienteACrear.Estado = "1";
            clienteACrear.Fec_Nacimiento = new DateTime(1982, 03, 25);
            // 3. Declaramos la entidad que contendrá el resultado
            Cliente clienteCreado = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                clienteCreado = clienteDAO.Crear(clienteACrear);
                codigoGenerado = clienteCreado.Codigo;
            }, "cliente creado");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(clienteCreado);
            // Probamos que el código generado sea mayor a 0
            Assert.Greater(clienteCreado.Codigo, 0);
            // Probamos que los nombres registrado es igual al solicitado con la entidad
            Assert.AreEqual(clienteCreado.Nombres, clienteCreado.Nombres);
            // Probamos que el apellido registrado es igual a la solicitada con la entidad
            Assert.AreEqual(clienteCreado.Apellidos, clienteACrear.Apellidos);
        }
        [Test]
        public void Test2_Obtener()
        {
            // 1. Clase a probar: LocalDAO
            Assert.IsNotNull(clienteDAO);
            // 2. Definimos los datos para la prueba
            int codigo = codigoGenerado;
            // 3. Declaramos la entidad que contendrá el resultado
            Cliente clienteObtenido = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                clienteObtenido = clienteDAO.Obtener(codigo);
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(clienteObtenido);
            Assert.AreEqual(clienteObtenido.Codigo, codigo);
            Assert.IsNotNullOrEmpty(clienteObtenido.Nombres);
            Assert.IsNotNullOrEmpty(clienteObtenido.Apellidos);
        }       
    }
}
